/**
 * 判断坐标点是否在多边形范围内方法
 * @param {Object} p    目标坐标点
 * @param {Array} poly  (目标)多边形坐标点数组
 * */
const pointInPolygon = (p, poly) => {
	var px = p.x,
		py = p.y,
		flag = false;

	for (var i = 0, l = poly.length, j = l - 1; i < l; j = i, i++) { 
		var sx = poly[i].x,
			sy = poly[i].y,
			tx = poly[j].x,
			ty = poly[j].y;

		// 点与多边形顶点重合
		if ((sx === px && sy === py) || (tx === px && ty === py)) {
			return true; // 在点上
		}

		// 判断线段两端点是否在射线两侧
		if ((sy < py && ty >= py) || (sy >= py && ty < py)) {
			// 线段上与射线 Y 坐标相同的点的 X 坐标
			var x = sx + (py - sy) * (tx - sx) / (ty - sy)

			// 点在多边形的边上
			if (x === px) {
				return true; //在点上
			}

			// 射线穿过多边形的边界
			if (x > px) {
				flag = !flag
			}
		}
	}

	// 射线穿过多边形边界的次数为奇数时点在多边形内
	return flag ? true : false
}


/**
 * 获取两点之间的距离 getDistance
 * @param {Number}  lat1 纬度1
 * @param {Number}  lon1 经度1
 * @param {Number}  lat2 纬度2
 * @param {Number}  lon2 经度2
 * @return {Number}
 * */
const deg2rad = deg => deg * (Math.PI / 180);
const getDistance = (lat1, lon1, lat2, lon2) => {
	// 经纬度计算距离，单位:km,保留3位小数
	const R = 6371
	const dLat = deg2rad(lat2 - lat1)
	const dLon = deg2rad(lon2 - lon1)
	const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(dLon /
		2) * Math.sin(dLon / 2)
	const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
	return Number((R * c).toFixed(3))
}

/**
 * stime 开始时间 etime 结束时间
 */
const compareTime = (startTime, endTime) => {
	let nowTime = new Date()
	// 如果当前时间处于时间段内，返回true，否则返回false
	if (nowTime < startTime || nowTime > endTime) {
		return false
	}
	return true
}

/**
 * 计算是否正在营业中
 * @param {Array}  bussinessHours 营业时间范围 
 * @return {String} （营业时间开始前、营业中、营业时间结束后）
 * */
const isOpening = bussinessHours => {
	bussinessHours = bussinessHours.sort((a, b) => {
		return Number(b.from.split(':')[0]) - Number(a.from.split(':')[0])
	})
	let stauts = 'opening'
	const B = bussinessHours.length - 1
	for (let i = 0; i < bussinessHours.length; i++) {
		const fromArr = bussinessHours[i].from.split(':')
		const startTime = new Date()
		startTime.setHours(fromArr[0])
		startTime.setMinutes(fromArr[1])
		const toArr = bussinessHours[i].to.split(':')
		const endTime = new Date()
		endTime.setHours(toArr[0])
		endTime.setMinutes(toArr[1])
		const nowTime = new Date()
		// 双时段营业 && 在营业时间内
		if (B > 0) {
			if (i == 0) {
				if (compareTime(startTime, endTime)) {
					return 'opening'
				}

				// 营业时间开始前
				if (nowTime <= startTime) {
					stauts = 'beforeOpening'
				}
				// 营业时间结束后
				if (nowTime >= endTime) {
					stauts = 'afterClosing'
				}
			}

			if (i == 1) {
				if (compareTime(startTime, endTime)) {
					return 'opening'
				}
				return stauts
			}
		} else {
			// 营业时间开始前
			if (nowTime <= startTime) {
				stauts = 'beforeOpening'
				return stauts
			}
			// 营业时间结束后
			if (nowTime >= endTime) {
				stauts = 'afterClosing'
				return stauts
			}
			stauts = 'opening'
			return stauts
		}
	}
	return stauts
}

module.exports = {
	pointInPolygon,
	getDistance,
	isOpening
}
